//给定一个字符串 s，找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 
//
// 示例 1： 
//
// 输入: "babad"
//输出: "bab"
//注意: "aba" 也是一个有效答案。
// 
//
// 示例 2： 
//
// 输入: "cbbd"
//输出: "bb"
// 
// Related Topics 字符串 动态规划

package leetcode.editor.cn;
//Java：最长回文子串
public class P5LongestPalindromicSubstring{
    public static void main(String[] args) {
        Solution solution = new P5LongestPalindromicSubstring().new Solution();
        // TO TEST
    }
    //leetcode submit region begin(Prohibit modificatio n and deletion)
class Solution {
    public String longestPalindrome(String s) {
        //使用动态规划：时间复杂度O(n^2)
        //动态数组：dp[][],代表i->j字符串是否是回文串i<j
        //len=1,为T;len=2,需要判断两个字符是否相等即可，len=3，dp[i+1][j-1]^s[i]==s[j]
        if(s==null ||s.length() <= 1)return s;
        int maxLen = 1;
        int begin=0;
        int len = s.length();
        boolean[][] dp = new boolean[len][len];
        for(int i =0;i<len;i++){
            dp[i][i] = true;
        }
        char[] chars = s.toCharArray();
        //固定j，增加i
        for(int j=1;j<len;j++){
            for (int i =0;i<j;i++){
                if(j-i==1){
                    dp[i][j] = chars[i]==chars[j]?true:false;
                }else{
                    dp[i][j] = chars[i]==chars[j]?dp[i+1][j-1]:false;
                }
                if(dp[i][j] && j-i+1>maxLen){
                    maxLen = j-i+1;
                    begin = i;
                }
            }
        }
        return s.substring(begin,begin+maxLen);
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
